/* The file is saved in UTF-8 codepage.
 * Check: «Stereotype», Section mark-§, Copyright-©, Alpha-α, Beta-β, Smile-☺
 */
package cz.pecinovsky.english.lootp._115_;

import cz.pecinovsky.english.lootp._parents._ICar_120_124;
// %I+ <124
//import cz.pecinovsky.english.lootp.manager.chozí.IPaintable;
// %I-
import cz.pecinovsky.english.lootp.manager.IMoveable;
import cz.pecinovsky.english.lootp.manager.Painter;
import cz.pecinovsky.english.lootp.manager.Rectangle;

import cz.pecinovsky.english.lootp.utility.NamedColor;
import cz.pecinovsky.english.lootp.utility.Position;



import cz.pecinovsky.english.lootp.manager.CanvasManager_Envelope.               CanvasManager;
import cz.pecinovsky.english.lootp._115_.Light_120_124.                         Light;

//import cz.pecinovsky.english.lootp._115_.Car_116_119.                            Car;
////////////////////////////////////////////////////////////////////////////////
//%%+  +++++ End of ignored starting test - place for imports +++++

//%X+ xxxxx Start of the ovejumped text with declaration of the envelope xxxxx
/*******************************************************************************
 *<pre>
 * Předchozí:   oopnz._115_._116_Autor_119
 * Následující: Prozatím není
 *
 * Projekt  020z - Komentáře
 *   + Začlenění do standardní šablony + Komentáře
 *
 * Projekt  021z - Použití this
 *   ~ V prvních dvou konstruktorech nahrazena původní těla
 *     příkazem this volajícím obecnější konstruktor
 *
 * Projekt  022z - Přetěžování
 *   + Přidány další dva konstruktory
 *   ~ Ve třetím konstruktoru nahrazeno tělo příkazem this
 *     volající přidaný obecnější konstruktor
 *
 * Projekt  Ppp
 *   + Přidáno
 *   - Odebráno
 *   ~ Změněno
 *</pre>
 */
public class Car_120_124
{    private Car_120_124() {}   static
////////////////////////////////////////////////////////////////////////////////
//%X- ----- End of the ovejumped text with declaration of the envelope -----


/*******************************************************************************
 * Instance třídy {@code Car} představují auta směřující na východ.
 *
 * @author Rudolf PECINOVSKÝ
 * @version 6.03.2017 — 2010-11-08
 */
//%I+ <124
//public class Car implements IPaintable
//%I-
//%A+ >124
public class Car implements IMoveable
//%A-
//%A+ <0
        ,   _ICar_120_124
//%A-
{
//== CONSTANT CLASS ATTRIBUTES =================================================
//== VARIABLE CLASS ATTRIBUTES =================================================
//== STATIC CONSTRUCTOR (CLASS INITIALIZER, STATIC INICITALIZING BLOCK) ========
//== CONSTANT INSTANCE ATTRIBUTES ==============================================

    /** Podvozek auta. */
    private Rectangle chassis;

    /** Kabina auta. */
    private Rectangle cab;

    /** Levé přední light. */
//%I+ <122
//    private Ellipse lightL;
//%I-
//%A+ >122
    private Light lightL;
//%A-

    /** Pravé přední light. */
//%I+ <122
//    private Ellipse lightR;
//%I-
//%A+ >122
    private Light lightR;
//%A-



//== VARIABLE INSTANCE ATTRIBUTES ==============================================
//== CLASS GETTERS AND SETTERS =================================================
//== OTHER NON-PRIVATE CLASS METHODS ===========================================

//##############################################################################
//== CONSTUCTORS AND FACTORY METHODS ===========================================

    /***************************************************************************
     * Vytvoří car implicitních rozměrů a s implicitní barvou podvozku
     * umístěné v levém horním rohu plátna.
     */
    public Car()
    {
//%I+ <121
//        chassis = new Rectangle(  0,  0, 128, 64, NamedColor.BLUE);
//        cab     = new Rectangle( 16, 16,  64, 32, NamedColor.GRAY);
//        lightL  = new Ellipse  (112,  0,  16, 16, NamedColor.YELLOW);
//        lightR  = new Ellipse  (112, 48,  16, 16, NamedColor.YELLOW);
//%I-
//%A+ >121
         this(0, 0);
//%A-
    }


    /***************************************************************************
     * Vytvoří car implicitních rozměrů a s implicitní barvou podvozku
     * umístěné na zadaných souřadnicích.
     *
     * @param x  Vodorovná souřadnice
     * @param y  Svislá souřadnice
     */
    public Car(int x, int y)
    {
//%I+ <121
//        chassis = new Rectangle(x+  0, y+ 0, 128, 64, NamedColor.BLUE);
//        cab     = new Rectangle(x+ 16, y+16,  64, 32, NamedColor.GRAY);
//        lightL  = new Ellipse  (x+112, y+ 0,  16, 16, NamedColor.YELLOW);
//        lightR  = new Ellipse  (x+112, y+48,  16, 16, NamedColor.YELLOW);
//    }
//%I-
//%A+ >121
        this(x, y, NamedColor.BLUE);
    }
//%A-


    /***************************************************************************
     * Vytvoří car implicitních rozměrů se zadanou barvou podvozku
     * umístěné na zadaných souřadnicích.
     *
     * @param x  Vodorovná souřadnice
     * @param y  Svislá souřadnice
     * @param chassisColor  Požadovaná color podvozku
     */
    public Car(int x, int y, NamedColor chassisColor)
    {
//%I+ <122
//        chassis = new Rectangle(x+  0, y+ 0, 128, 64, chassisColor);
//        cab     = new Rectangle(x+ 16, y+16,  64, 32, NamedColor.GRAY);
//        lightL  = new Ellipse  (x+112, y+ 0,  16, 16, NamedColor.YELLOW);
//        lightR  = new Ellipse  (x+112, y+48,  16, 16, NamedColor.YELLOW);
//    }
//%I-
//%A+ >122
        this(x, y, 128, chassisColor);
    }


    /***************************************************************************
     * Vytvoří car zadané délky s implicitní barvou podvozku
     * umístěné na zadaných souřadnicích.
     *
     * @param x  Vodorovná souřadnice vytvářeného světla
     * @param y  Svislá souřadnice vytvářeného světla
     * @param length  Délka auta
     */
    public Car(int x, int y, int length)
    {
        this(x, y, length, NamedColor.BLUE);
    }


    /***************************************************************************
     * Vytvoří car zadané délky se zadanou barvou podvozku
     * umístěné na zadaných souřadnicích.
     *
     * @param x  Vodorovná souřadnice vytvářeného světla
     * @param y  Svislá souřadnice vytvářeného světla
     * @param length         Délka auta
     * @param chassisColor Požadovaná color podvozku
     */
    public Car(int x, int y, int length, NamedColor chassisColor)
    {
//%A-
//%I+ >122 <123
//        chassis = new Rectangle(x, y, length, length/2, chassisColor);
//        cab     = new Rectangle(x+length/8, y+length/8, length/2, length/4,
//                                                        NamedColor.GRAY);
//        lightL  = new Light(x+7*length/8, y,            length/8);
//        lightR  = new Light(x+7*length/8, y+3*length/8, length/8);
//%I-
//%A+ >123
        int d1 = length;
        int d2 = length/2;
        int d4 = length/4;
        int d8 = length/8;

        chassis = new Rectangle(x,    y,    d1, d2, chassisColor);
        cab     = new Rectangle(x+d8, y+d8, d2, d4, NamedColor.GRAY);

        lightL  = new Light(x+7*d8, y,      d8);
        lightR  = new Light(x+7*d8, y+3*d8, d8);
//%A-
//%A+ >122
    }
//%A-



//== ABSTRACT METHODS ==========================================================
//== INSTANCE GETTERS AND SETTERS ==============================================
//%A+ >124

    // Sada přístupových metod vlastnosti: Position ******************************

    /***************************************************************************
     * Vrátí x-ovou (vodorovnou) souřadnici pozice instance.
     *
     * @return  x-ová souřadnice.
     */
    @Override
    public int getX()
    {
        return chassis.getX();
    }


    /***************************************************************************
     * Vrátí y-ovou (svislou) souřadnici pozice instance.
     *
     * @return  y-ová souřadnice.
     */
    @Override
    public int getY()
    {
        return chassis.getY();
    }

//%A-
//%A+ >125

    /***************************************************************************
     * Vrátí přepravku se svojí aktuální pozicí.
     *
     * @return Aktuální pozice světla
     */
//%A-
//%A+ >126
    @Override
//%A-
//%A+ >125
    public Position getPosition()
    {
        return new Position(getX(), getY());
    }


    /***************************************************************************
     * Nastaví novou pozici světla.
     *
     * @param p Nastavovaná pozice
     */
//%A-
//%A+ >126
    @Override
//%A-
//%A+ >125
    public void setPosition(Position p)
    {
        this.setPosition(p.x, p.y);
    }

//%A-
//%A+ >123

    /***************************************************************************
     * Nastaví novou pozici instance.
     *
     * @param x   Nová x-ová pozice instance
     * @param y   Nová y-ová pozice instance
     */
//%A-
//%A+ >124
    @Override
//%A-
//%A+ >123
    public void setPosition(int x, int y)
    {
        int d8 = chassis.getWidth() / 8;   //Osmina délky vozu

        chassis.setPosition(x,      y);
        cab    .setPosition(x+d8,   y+d8);
        lightL .setPosition(x+7*d8, y);
        lightR .setPosition(x+7*d8, y+3*d8);
    }

//%A-
//%A+ >124

    // Sada přístupových metod vlastnosti: Rozměr / Modul **********************

    /***************************************************************************
     * Vrátí základní délku, od níž se odvozují všechny rozměry objektu -
     * pro car je to jeho délka.
     *
     * @return Délka auta
     */
//%A-
//%A+ <0
    @Override
//%A-
//%A+ >124
    public int getModule()
    {
        return chassis.getWidth();
    }

//%A-
//%A+ >123

    /***************************************************************************
     * Nastaví nový základní rozměr instance - novou délku vozu.
     * Ostatní rozměry jsou od ní odvozené.
     *
     * @param module  Nově nastavovaná délka auta; délka > 0
     */
//%A-
//%A+ <0
    @Override
//%A-
//%A+ >123
    public void setModule(int module)
    {
        int x  = chassis.getX();
        int y  = chassis.getY();
        int m1 = module;
        int m2 = m1/2;
        int m4 = m1/4;
        int m8 = m1/8;

        chassis.setSize(m1, m2);

        //U ostatních částí vozu se se změnou rozměru vozu mění i jejich pozice
        cab.setPosition(x+m8, y+m8);
        cab.setSize(m2, m4);

        lightL.setPosition(x+7*m8, y);
        lightR.setPosition(x+7*m8, y+3*m8);
        lightL.setModule(m8);
        lightR.setModule(m8);
    }



//%A-
//== OTHER NON-PRIVATE INSTANCE METHODS ========================================
//%A+ >122

    /***************************************************************************
     * Blikne světly na levé straně auta.
     */
//%A-
//%A+ <0
    @Override
//%A-
//%A+ >122
    public void blinkLeft()
    {
        lightL.blink();
    }


    /***************************************************************************
     * Blikne světly na pravé straně auta.
     */
//%A-
//%A+ <0
    @Override
//%A-
//%A+ >122
    public void blinkRight()
    {
        lightR.blink();
    }

//%A-

    /***************************************************************************
     * Prostřednictvím dodaného kreslítka vykreslí obraz své instance.
     *
     * @param painter Painter, které nakreslí instanci
     */
    @Override
    public void paint(Painter painter)
    {
        chassis.paint(painter);
        cab    .paint(painter);
        lightL .paint(painter);
        lightR .paint(painter);
    }

//%A+ >122

    /***************************************************************************
     * Rozsvítí všechna světla auta.
     */
//%A-
//%A+ <0
    @Override
//%A-
//%A+ >122
    public void lightOn()
    {
        lightL.switchOn();
        lightR.switchOn();
    }


    /***************************************************************************
     * Zhasne všechna světla auta.
     */
//%A-
//%A+ <0
    @Override
//%A-
//%A+ >122
    public void lightOff()
    {
        lightL.switchOff();
        lightR.switchOff();
    }

//%A-


//== PRIVATE AND AUXILIARY CLASS METHODS =======================================
//== PRIVATE AND AUXILIARY INSTANCE METHODS ====================================
//== EMBEDDED TYPES AND INNER CLASSES ==========================================
//== TESTING CLASSES AND METHODS ===============================================
//
//    /***************************************************************************
//     * Test method.
//     */
//    public static void test()
//    {
//        Light inst = new Light();
//    }
//    /** @param args Parametry příkazového řádku - nepoužívané. */
//    public static void main(String[] args)  {  test();  }
    }

//%%- ---- Start of the ovejumped text with closing of the envelope ----
////////////////////////////////////////////////////////////////////////////////
//== TESTING CLASSES AND METHODS ===============================================

    /***************************************************************************
     * Test method.
     */
    public static void test()
    {
//        new Car();
//        new Car(100, 100);
//        new Car(50, 200, NamedColor.BLACK);

        //023
        CanvasManager CM = CanvasManager.getInstance();
        CM.setStepAndSize(25, 10, 6);
        CM.setName("Auto v souřadné mřížce");
        Car a = new Car(25, 25, 200);
        CM.add(a);
//        System.exit(0);
    }
    /** @param args Parametry příkazového řádku - nepoužívané. */
    public static void main(String[] args)  {  test();  }
}
